package cn.com.ccxe.dao;

import java.util.List;

import cn.com.ccxe.core.entity.Keyword;
import cn.com.ccxe.core.entity.MonitorType;

public interface KeywordDao {
	
	/**
	 * 添加keyword，keyword的ID请调用序列获取。
	 * 还需维护与{@link MonitorType}之间的关系。
	 * @param keyword
	 * @return
	 */
	public OperationStatus add(Keyword keyword);
	
	/**
	 * 修改keyword信息<br>
	 * 每个keyword对象都有一个唯一且不可变的ID，
	 * 在修改keyword对象时，在编写SQL语句时不能对ID进行任何修改。
	 * @param id
	 * @param keyword
	 * @return 返回操作状态，请看{@link DBConstant}
	 */
	public OperationStatus update(int id,Keyword keyword);
	
	/**
	 * 修改keyword信息<br>
	 * keyword对象中必须有ID，细节请看{@link #update(int, keyword)}方法
	 * @param keyword
	 * @return
	 */
	public OperationStatus update(Keyword keyword);
	
	/**
	 * 根据keyword的ID删除，如果有与之相关联的数据，需先将与之相关联的数据删除。
	 * @param keywordId
	 * @return
	 */
	public OperationStatus del(int keywordId);
	
	/**
	 * 修改关键字所属的类别
	 * @param keywordId 关键字ID
	 * @param oldMonitorTypeId 现属类别
	 * @param newMonitorTypeId 期望类别
	 * @return
	 */
	public OperationStatus updateMonitorType(int keywordId, int oldMonitorTypeId, int newMonitorTypeId);
	
	/**
	 * 清除{@link Keyword}的所属监控类别
	 * @param keywordId
	 * @param monitorTypeId
	 * @return
	 */
	public OperationStatus delRelationshipForMonitorType(int keywordId,int monitorTypeId);
	
	/**
	 * 根据ID查询{@link Keyword}
	 * @param keywordId
	 * @return
	 */
	public Keyword getKeyword(int keywordId);
	
	/**
	 * 获取该{@link MonitorType}下的所有{@link Keyword}。<br>
	 * 但并没有给{@link List}容器中的{@link Keyword}的成员对象赋值，
	 * 然{@link MonitorType}可以根据传入的<tt>monitorTypeId</tt>构建。
	 * 在使用时，注意不要试图直接获取{@link MonitorType}的相关信息，如有需要应谨慎处理。
	 * @param monitorTypeId
	 * @return
	 */
	public List<Keyword> getAllKeywordInType(int monitorTypeId);

	/**
	 * 获取所有的{@link Keyword}
	 * @return
	 */
	public List<Keyword> getAllKeyword();
	
	/**
	 * 根据{@link Keyword}的ID统计与之关联的数据。
	 * @param keywordId
	 * @return
	 */
	public int count(int keywordId);

	/**
	 * 添加与{@link MonitorType}的关联关系。
	 * @param keywordId
	 * @param monitorTypeId
	 */
	public OperationStatus addRelationshipForMonitorType(int keywordId, int monitorTypeId);

	/**
	 * 根据ID获取{@link Keyword}.
	 * @param id
	 * @return
	 */
	public Keyword get(int id);
	
	/**
	 * 获取没有与{@link Keyword}关联的{@link MonitorType}
	 * @param keywordId
	 * @return
	 */
	public List<MonitorType> getMonitorNothingWithKeyword(int keywordId);
	
	/**
	 * 根据用户收藏的ID查询与某站点关联的所有关键字
	 * @param favoriteId
	 * @return
	 */
	List<Keyword> getKeywordByFavoriteId(int favoriteId);

	/**
	 * 删除引用关系
	 * @param id
	 * @return
	 */
	public OperationStatus delAllRelationship(int id);

	/**
	 * 根据传入的文本查询关键字，最多返回10个。
	 * @param text
	 */
	public List<Keyword> getKeyword(String text);
	
}
